/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*   File:      PackageData.cpp
*   Author:    刘洋兵
*   Function:  协议数据封装/解析功能实现类
*   Time:      2025-09-09
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include "PackageData.h"
#include <QDebug>

/**
 * @brief  PackageData构造函数
 */
PackageData::PackageData(QObject *parent)
    : QObject(parent)
{
}

/**
 * @brief  PackageData析构函数
 */
PackageData::~PackageData()
{
}

/**
 * @brief  数据完整封装
 * @param  dataMap 封装数据库操作数据时需包含'data'嵌套的json结构
 * @param  infomap 封装的基本协议数据
 * @param  function_code 功能号
 * @param  requestId 协议指令唯一id
 * @param  is_data 是否包含数据库操作函数
 * @return 应输包含封装好的QByteArray容器
 */
QByteArray PackageData::convertToJson(const QMap<QString, QVariant> &datamap,
                                      const QMap<QString, QVariant> &infomap,
                                      int functionCode,
                                      const QString &requestId,
                                      bool is_data)
{
    QJsonObject jsonObj = createJsonObject(datamap, infomap, requestId,is_data);
    jsonObj["function_code"] = functionCode;

    QJsonDocument doc(jsonObj);
    return doc.toJson(QJsonDocument::Compact);
}

/**
 * @brief  数据分级封装
 * @param  dataMap 封装数据库操作数据时需包含'data'嵌套的json结构
 * @param  infomap 封装的基本协议数据
 * @param  requestId 协议指令唯一id
 * @param  is_data 是否包含数据库操作函数
 * @return 应输包含封装好的QJsonObject容器
 */
QJsonObject PackageData::createJsonObject(const QMap<QString, QVariant> &datamap,
                                          const QMap<QString, QVariant> &infomap,
                                          const QString &requestId,
                                          bool is_data)
{
    QJsonObject jsonObj;
    jsonObj["request_id"] = requestId;

    QJsonObject dataInfo;
    QMap<QString, QVariant>::const_iterator it;
    for(it = infomap.constBegin(); it != infomap.constEnd(); ++it) {
        if(it.value().userType() == QMetaType::Int) {
            dataInfo[it.key()] = it.value().toInt();
        }else{
            dataInfo[it.key()] = it.value().toString();
        }
    }
    if(is_data){
        if(!datamap.isEmpty()) {
            QJsonObject data;
            QMap<QString, QVariant>::const_iterator it;
            for(it = datamap.constBegin(); it != datamap.constEnd(); ++it) {
                if(it.value().userType() == QMetaType::Int) {
                    data[it.key()] = it.value().toInt();
                }else{
                    if(it.value().userType() == QMetaType::Double) {
                        data[it.key()] = it.value().toDouble();
                    }else {
                        data[it.key()] = it.value().toString();
                    }
                }
            }
            dataInfo["data"] = data;
        }
    }
    jsonObj["data_info"] = dataInfo;
    return jsonObj;
}

void PackageData::convertFromJson(const QJsonObject &obj)
{

}
